迷宫问题
Description
定义一个二维数组:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 Sample Output (0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4) Source |
解:
BFS简单题,但是要存储路径,定义一个结构体数组pre[]用来存储所有走过的店,在定义结构体的时候,使用par存储父节点的位置下标,使用ii存储自己的下标。
其中d[][]用于存储走过的距离这题可以不用。
#include <stdio.h>
#include <iostream>
#include <queue>
#define INF 1<<30
using namespace std;
typedef struct node{
int x;
int y;
int par;
int ii;
}Node;
const int MAX=105;
int map[MAX][MAX];
int n=5;
int m=5;
int sx,sy,gx,gy;
int d[MAX][MAX];
node pre[MAX*MAX];
int dis[4][2]={1,0,-1,0,0,1,0,-1};
int index=0;
int bfs()
{
queue<node> q;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
d[i][j]=INF;
}
}
node no;
no.x=sx;no.y=sy;no.ii=index;no.par=-1;
pre[index++]=no;
q.push(no);
d[sx][sy]=0;
while(q.size())
{
node nod=q.front();
q.pop();
if(nod.x==gx && nod.y==gy)
{
break;
}
for(int i=0;i<4;i++)
{
int nx=nod.x+dis[i][0];
int ny=nod.y+dis[i][1];
if(nx>=0 && nx<n && ny>=0 && ny<m && map[nx][ny]!=1 && d[nx][ny]==INF){
no.x=nx;
no.y=ny;
no.par=nod.ii;
no.ii=index;
pre[index]=no;
q.push(no);
index++;
d[nx][ny]=d[nod.x][nod.y]+1;
}
}
}
return d[gx][gy];
}
void path(int x)
{
if(x<0)
return;
path(pre[x].par);
printf("(%d, %d)\n",pre[x].x,pre[x].y);
}
int main()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>map[i][j];
}
}
sx=0;sy=0;
gx=4;gy=4;
bfs();
path(index-1);
printf("\n");
return 0;
}